package cn.template.serve_project.util;

import cn.template.serve_project.constant.JwtConstant;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Jwt工具类
 */
public class JwtUtil {


    /**
     * 创建token
     *
     * @param iss      签发人
     * @param duration 有效时长
     * @param info     额外的负载信息
     * @return token令牌
     */
    public static String createToken(String iss, long duration, Map<String, Object> info) {
        long time = new Date().getTime();
        return JWT.create()
                .withPayload(info)
                .withIssuer(iss)
                .withJWTId(UUID.randomUUID().toString()).withExpiresAt(new Date(time + duration))
                .sign(Algorithm.HMAC256(JwtConstant.SECRET_KEY));
    }


    /**
     * 解析token
     *
     * @param token token令牌
     * @return 解密信息
     */
    public static Map<String, Object> parseToken(String token) {
        try {
            //设置解密的规则
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(JwtConstant.SECRET_KEY)).build();
            DecodedJWT verify = jwtVerifier.verify(token); //进行token解密
            return new HashMap<>(verify.getClaims());//返回解密的信息
        } catch (Exception e) {
            return null;
        }

    }


    /**
     * token检查
     *
     * @param token token令牌
     * @return 是否有效
     */
    public static Boolean isVerify(String token) {
        try {
            //设置解密的规则
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(JwtConstant.SECRET_KEY)).build();
            jwtVerifier.verify(token); //进行token解密
            return true;
        } catch (Exception e) {
            return false;
        }

    }

}
